AWS AppSyncで複数の認証モードがサポートされました!
AWS AppSyncに熱いアップデート
マネージドGraphQLサービスであるAWS AppSyncで 複数の認証モード がサポートされました!
AWS AppSync now supports multiple authorization modes on a single GraphQL API! ??? Launch blog & more coming, check out the docs for the service and client today:https://t.co/YIkO8XzsQHhttps://t.co/JFFD6Iy92thttps://t.co/UFOJCeald4
— Ricardo (@undef_obj) 2019年5月14日
- Using Additional Authorization Modes | Security - AWS AppSync
- AWS AppSync Multi Auth | API | Amplify JavaScript
- Multi-Auth | API | Amplify iOS
これまではAPIに対して1つの認証モードのみが設定可能でしたが、今回のアップデートにより複数の認証モードを設定できるようになりました。
メリット
認証モードが1つしか設定できない場合、個人的には主に開発時やデバッグ時に不便な時がありました。例えば以下のようなケースです。
- APIは一般ユーザーにはCognito User Poolで認証させたいが、開発時はAPI Keyで利用できるようにしたい
- Cognito User Poolの他にOpenID Connect Providerのユーザーからも利用できるようにしたい
かなり柔軟に対応できるようになりました!
複数の認証モードを使ってみた
認証モードの設定
今回は例として以下のサンプルを用いました。
AppSync APIの設定画面がアップデートされ、以下のように認証モードの追加が行えるようになっています。
サポートされている認証モードは従来通りです。
- API Key
- IAM
- Cognito User Pool
- OpenID Connect
従来の単一の認証モードを プライマリの認証モード として扱い、複数の認証モードを増やしたい場合は 認証モードを増やす 形を取ります。
今回はCognito User Poolをプライマリの認証モードとし、API Keyによる認証モードを追加します。
API Keyの場合、認証モードを足して一度保存したあとにAPI Keyの管理UI(API Keyの追加や削除)が表示される点に注意してください。
Schemaの修正
複数の認証モードについて、Query、Mutation、Typeごとにどの認証モードで使えるようにするか指定することができます。Schemaに以下のようなディレクティブを追加します。
@aws_api_key
: API Keyによる認証でのアクセスを許可する@aws_iam
: AWS IAMによる認証でのアクセスを許可する@aws_oidc
: OpenID Connectによる認証でのアクセスを許可する@aws_cognito_user_pools
: Amazon Cognito User Poolsによる認証でのアクセスを許可する
例えば以下のようなSchemaを例とします。
type Query { getPicture(id: ID!): Picture listPictures(filter: ModelPictureFilterInput, limit: Int, nextToken: String): ModelPictureConnection } type ModelPictureConnection { items: [Picture] nextToken: String } type Picture { id: ID! name: String owner: String visibility: Visibility file: S3Object createdAt: String }
プライマリの認証方法はCognito User Poolで行うこととし listPictures
のみをAPI Keyを使ったアクセスを許可したい場合は次のように書きます。
type Query { getPicture(id: ID!): Picture listPictures(filter: ModelPictureFilterInput, limit: Int, nextToken: String): ModelPictureConnection @aws_api_key @aws_cognito_user_pools } type ModelPictureConnection @aws_api_key @aws_cognito_user_pools { items: [Picture] nextToken: String } type Picture @aws_api_key @aws_cognito_user_pools { id: ID! name: String owner: String visibility: Visibility file: S3Object createdAt: String }
詳しくは以下のドキュメントも参考にしてください。
試してみる
今回はサンプルとして aws-samples/aws-amplify-graphql を使っています。こちらはプライベート画像を管理するWebアプリケーションです。
Webアプリケーションからは普通にプライマリの認証モードであるCognito User Poolを使ってログインしたあと、APIリクエストが行えます。
次にサンプルアプリとは別に、GraphQLクライアントを用意します。今回はMacアプリの GraphiQL を使いました。
API Keyの場合はHTTP Headerに x-api-key
を設定することで認証ができます。
@aws_api_key
ディレクティブを追加しない場合はもちろん弾かれます。
@aws_api_key
ディレクティブを追加すると、正常にレスポンスが返ってきました。
AppSyncがより使いやすくなるアップデートです!
開発の効率化や複数の認証プロバイダをサポートしたい場合など、様々なケースで活用できる素晴らしいアップデートでした。
ぜひぜひ使っていきましょう!